home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / DOCVIEW.PAK / INFOVIEW.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  5KB  |  207 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1993, 1995 by Borland International, All Rights Reserved
  4. //
  5. //   Implements class TInfoView
  6. //----------------------------------------------------------------------------
  7. #include <owl/pch.h>
  8. #include <owl/docmanag.h>
  9. #include <owl/filedoc.h>
  10. #include <owl/dc.h>
  11. #include "infoview.rc"
  12.  
  13. class _DOCVIEWCLASS TInfoView : public TWindowView {
  14.   public:
  15.     struct Data {
  16.       const char*  PropName;
  17.       char*        PropData;
  18.       int          PropSize;
  19.       int          PropFlags;
  20.     };
  21.     TInfoView(TDocument& doc, TWindow* parent = 0);
  22.    ~TInfoView();
  23.     static const char far* StaticName() {return "Info View";}  // put in resource
  24.     const char far* GetViewName() {return StaticName();}
  25.     bool     SetDocTitle(const char far* docname, int index)
  26.              { Invalidate(); return TWindow::SetDocTitle(docname, index); }
  27.     void Paint(TDC&, bool, TRect&);
  28.  
  29.   protected:
  30.     Data* PropList;
  31.     int   PropCount;
  32.     int   YLoc;
  33.     int   OpenCount;  //temp
  34.     int   CloseCount; //temp
  35.     void  GetInfo();
  36.     void  Init();
  37.  
  38.     //
  39.     // event handlers
  40.     //
  41.     void  CmInfoOpen();
  42.     bool  VnViewOpened(TView*);
  43.     bool  VnViewClosed(TView*);
  44.     bool  VnDocOpened(int omode);
  45.     bool  VnDocClosed(int omode);
  46.     bool  VnIsWindow(HWND hWnd) {return GetHandle() == hWnd;}
  47.  
  48.   DECLARE_RESPONSE_TABLE(TInfoView);
  49.   DECLARE_STREAMABLE(,TInfoView,1);
  50. };
  51.  
  52. DEFINE_RESPONSE_TABLE1(TInfoView, TWindow)
  53.   EV_COMMAND(CM_INFOOPEN, CmInfoOpen),
  54.   EV_VN_DOCOPENED,
  55.   EV_VN_DOCCLOSED,
  56.   EV_VN_VIEWOPENED,
  57.   EV_VN_VIEWCLOSED,
  58.   EV_VN_ISWINDOW,
  59. END_RESPONSE_TABLE;
  60.  
  61. TInfoView::TInfoView(TDocument& doc,TWindow* parent) : TWindowView(doc,parent)
  62. {
  63.   Attr.Style &= ~(WS_BORDER);
  64.   SetViewMenu(new TMenuDescr(IDM_INFOVIEW,0,1,0,0,0,1));
  65.   Init();
  66. }
  67.  
  68. void TInfoView::Init()
  69. {
  70.   PropCount = Doc->PropertyCount();
  71.   PropList = new Data[PropCount];
  72.   for (int i = 0; i < PropCount; i++) {
  73.     PropList[i].PropName = Doc->PropertyName(i+1);
  74.     PropList[i].PropFlags = Doc->PropertyFlags(i+1);
  75.     PropList[i].PropData = 0;
  76.   }
  77.   OpenCount = CloseCount = 0;  //temp
  78.   GetInfo();
  79. }
  80.  
  81. TInfoView::~TInfoView()
  82. {
  83.   for (int i = 0; i < PropCount; i++) {
  84.     delete PropList[i].PropData;
  85.   }
  86.   delete PropList;
  87. }
  88.  
  89. void TInfoView::GetInfo()
  90. {
  91.   bool changed = false;
  92.   int prop;
  93.   int len;
  94.   char buf[256+1];
  95.  
  96.   for (prop = 0; prop < PropCount; prop++) {
  97.     int flags = PropList[prop].PropFlags;
  98.     if ((flags & pfGetText) && !(flags & pfHidden)
  99.         && (len = Doc->GetProperty(prop+1, buf, sizeof(buf)-1)) != 0) {
  100.       if (PropList[prop].PropData) {
  101.         if (flags & pfConstant)
  102.           continue;
  103.         if (len == PropList[prop].PropSize) {
  104.           if (strcmp(buf, PropList[prop].PropData) != 0) {
  105.             strcpy(PropList[prop].PropData, buf);
  106.             changed = true;
  107.           }
  108.           continue;
  109.         }
  110.         delete PropList[prop].PropData;
  111.       
  112.       }
  113.       PropList[prop].PropData = strnewdup(buf);
  114.       PropList[prop].PropSize = len;
  115.       changed = true;
  116.     }
  117.   }
  118.   if (changed)
  119.     Invalidate();
  120. }
  121.  
  122. //  len = wsprintf(buf, "Document State:  %s  (Opens=%d Closes=%d)", (char far*)(Doc->IsOpen() ? "Open" : "Closed"),OpenCount,CloseCount);
  123.  
  124. void TInfoView::Paint(TDC& dc, bool /*erase*/, TRect&)
  125. {
  126.   TSize size;
  127.   static char separator[] = " = ";
  128.   int sepsize;
  129.   int prop;
  130.  
  131.   YLoc = 0;
  132.   dc.GetTextExtent(separator, sizeof(separator)-1, size);
  133.   sepsize = size.cx;
  134.   for (prop = 0; prop < PropCount; prop++) {
  135.     if (!PropList[prop].PropData)
  136.       continue;
  137.     int len = strlen(PropList[prop].PropName);
  138.     dc.GetTextExtent(   PropList[prop].PropName, len, size);
  139.     dc.TextOut(0, YLoc, PropList[prop].PropName, len);
  140.     dc.TextOut(size.cx, YLoc, separator, sizeof(separator)-1);
  141.     dc.TextOut(size.cx+sepsize, YLoc, PropList[prop].PropData,
  142.                                strlen(PropList[prop].PropData));
  143.     YLoc += size.cy;
  144.   }
  145. }
  146.  
  147. void
  148. TInfoView::CmInfoOpen()
  149. {
  150.   if (!Doc->IsOpen()
  151.       && Doc->GetDocPath() != 0
  152.       && Doc->Open(ofRead | shReadWrite | ofNoCreate | ofPriority)) {
  153. //  GetInfo();
  154.     Doc->Close();
  155.     OpenCount--; CloseCount--;
  156.   }
  157. }
  158.  
  159. bool
  160. TInfoView::VnViewOpened(TView*)
  161. {
  162.   GetInfo();
  163.   return true;
  164. }
  165.  
  166. bool
  167. TInfoView::VnViewClosed(TView*)
  168. {
  169.   GetInfo();
  170.   return true;
  171. }
  172.  
  173. bool
  174. TInfoView::VnDocOpened(int)
  175. {
  176.   ++OpenCount;
  177.   GetInfo();
  178.   return true;
  179. }
  180.  
  181. bool
  182. TInfoView::VnDocClosed(int)
  183. {
  184.   ++CloseCount;
  185.   GetInfo();
  186.   return true;
  187. }
  188.  
  189. IMPLEMENT_STREAMABLE1(TInfoView, TWindowView);
  190.  
  191. void*
  192. TInfoView::Streamer::Read(ipstream& is, uint32 /*version*/) const
  193. {
  194.   ReadBaseObject((TWindowView*)GetObject(), is);
  195.   GetObject()->Init();
  196.   return GetObject();
  197. }
  198.  
  199. void
  200. TInfoView::Streamer::Write(opstream &os) const
  201. {
  202.   WriteBaseObject((TWindowView*)GetObject(), os);
  203. }
  204.  
  205. DEFINE_DOC_TEMPLATE_CLASS(TFileDocument, TInfoView,   InfoTemplate);
  206. InfoTemplate infoTpl("InfoView, All files", "*.*", 0, 0,dtAutoDelete|dtReadOnly);
  207.